from flask import request, jsonify, current_app, session
from utils import constants
from ihome_blue import ihome_blue
from image_storage import image_storage
from init import db
from models import House, Area, User, Facility, HouseImage
from utils.response_code import RET


# 发布新房源
# 1. 需要用户填写全部房屋信息
# 2. 房屋的文字信息与图片分开操作



# 1.发布房源文字信息
@ihome_blue.route('/houses',methods = ['GET','POST'])
def newhouses():
    # 判断用户是否登录
    user_id = session.get('user_id')
    if not user_id:
        return jsonify(errno=RET.SESSIONERR,errmsg='用户未登录')

    # 获取参数
    user_id = User.id

    title = request.json.get('title')  #标题
    price = request.json.get('price')  #单价
    area_id = request.json.get('area_id')  #所在城区编号
    address = request.json.get('address')  #房屋地址
    room_count = request.json.get('room_count')  #房间数目
    acreage = request.json.get('acreage')  #房屋面积
    unit = request.json.get('unit')    #房屋单元，如：几室几厅
    capacity = request.json.get('capacity')  #房屋容纳的人数
    beds = request.json.get('beds')  #房屋床铺的配置
    deposit = request.json.get('deposit')  #房屋押金
    min_days = request.json.get('min_days')  #最少入住天数
    max_days = request.json.get('max_days')  #最大入住天数
    facility = request.json.get('facility')  #用户选择的设施信息id列表，如：[7, 8]


    #参数校验，为空校验
    if not all([title,price,area_id,address,room_count,acreage,unit,capacity,beds,deposit,min_days,max_days,facility]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")

    #参数类型转换
    try:
        price = int(price)
        deposit = int(deposit)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")


    #创建房屋对象
    house = House()

    house.user_id = user_id
    house.area_id = area_id
    house.title = title
    house.price = price
    house.address = address
    house.room_count = room_count
    house.acreage = acreage
    house.unit = unit
    house.capacity = capacity
    house.beds = beds
    house.deposit = deposit
    house.min_days = min_days
    house.max_days = max_days
    house.facility = facility


    try:
        db.session.add(house)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

    # 返回响应
    data = {
        'house' : house.to_full_dict()
    }
    return jsonify(errno=RET.OK, errmsg="发布成功",data=data)


#2.上传房屋图片
# 请求地址 /api/v1.0/houses/Vimages
# 请求方式 POST
# 请求参数 house_image，house_id
# 返回值 json数据

@ihome_blue.route("/houses/Vimages", methods=["POST"])
def newhouse_image():

    #判断用户是否登录
    user_id=session.get('user_id')
    if not user_id:
        return jsonify(errno=RET.SESSIONERR,errmsg='用户未登录')

    #获取参数
    image_file = request.files.get('house_image')
    house_id = request.files.get('house_id')

    # 参数校验
    if not all([image_file,house_id]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    try:
        house = House.query.get(house_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='数据库操作失败')
    if not house:
        return jsonify(errno=RET.NODATA,errmsg='房屋不存在')


    #上传图片
    try:
        # 读取图片为二进制,上传图片
        file_name = image_storage(image_file.read())
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="七牛云异常")

    if not file_name:
        return jsonify(errno=RET.NODATA, errmsg="图片上传失败")
    #将图片设置到新发布的房源信息身上
    house_image = HouseImage(house_id=house_id, url=file_name)

    # 保存到数据库中
    try:
        db.session.add(house_image)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='保存到数据库失败')

    image_url = constants.QINIU_URL_DOMAIN + file_name
    #拼接数据，渲染页面
    data = {"image_url": image_url}

    return jsonify(errno=RET.OK, errmsg="OK", data=data)



# 退出登录
# URL /api/v1.0/session
# 是否需要登录 是
# 请求方式 DELETE
# 请求参数 无
# 返回结果 errno ,errmsg


@ihome_blue.route('/session',methods=['GET','DELETE'])
def logout():
    #判断用户是否登录
    user_id = session.get('user_id')

    if not user_id:
        return jsonify(errno=RET.SESSIONERR,errmsg='用户未登录')

    # 清除session信息
    session.pop('user_id',None)
    # 2.返回响应
    return jsonify(errno=RET.OK, errmsg="退出成功")



# 获取发布页面的地区下拉菜单内容显示
@ihome_blue.route('/areas')
def user_areas():
    # 从数据库查询出地区信息
    try:
        area = Area.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询错误")
    # 拼接数据
    areas = []
    for area_ in area:
        areas.append(area_.to_dict())

    return jsonify(errno=RET.OK, errmsg="0", data=areas)













